/*
 * @(#)$FileName Copyright 2002 - 2004 JIDE Software Inc. All rights reserved.
 */

package com.element.plaf.office2003;

import com.element.plaf.vsnet.VsnetJideTabbedPaneUI;
import com.element.ui.tabs.JideTabbedPane;

import javax.swing.*;
import javax.swing.plaf.ComponentUI;
import java.awt.*;

/**
 * JideTabbedPane UI implementation
 */
public class Office2003JideTabbedPaneUI extends VsnetJideTabbedPaneUI {
	@Override
	public void installColorTheme() {
		super.installColorTheme();

		if (_tabPane.getColorTheme() != JideTabbedPane.COLOR_THEME_OFFICE2003)
			return;

		switch (getTabShape()) {
			case JideTabbedPane.SHAPE_ROUNDED_FLAT -> {
				_selectColor1 = getPainter().getControlShadow();
				_selectColor2 = getPainter().getControlShadow();
				_unselectColor1 = _selectColor1;
				_unselectColor2 = _selectColor2;
			}
			case JideTabbedPane.SHAPE_BOX -> {
				_selectColor1 = getPainter().getControlShadow();
				_selectColor2 = getPainter().getControlShadow();
				_unselectColor1 = getPainter().getControlShadow();
				_unselectColor2 = _lightHighlight;
			}
			case JideTabbedPane.SHAPE_EXCEL -> {
				_selectColor1 = getPainter().getControlShadow();
				_selectColor2 = null;
				_selectColor3 = null;
				_unselectColor1 = getPainter().getControlShadow();
				_unselectColor2 = null;
				_unselectColor3 = null;
			}
			case JideTabbedPane.SHAPE_WINDOWS, JideTabbedPane.SHAPE_WINDOWS_SELECTED -> {
				_selectColor1 = _lightHighlight;
				_selectColor2 = getPainter().getControlDk();
				_selectColor3 = getPainter().getControlShadow();
				_unselectColor1 = _selectColor1;
				_unselectColor2 = _selectColor2;
				_unselectColor3 = _selectColor3;
			}
			case JideTabbedPane.SHAPE_VSNET -> {
				_selectColor1 = getPainter().getControlShadow();
				_selectColor2 = getPainter().getControlShadow();
				_unselectColor1 = getPainter().getControlShadow();
			}
			default -> {
				_selectColor1 = getPainter().getControlShadow();
				_unselectColor1 = getPainter().getControlShadow();
				_unselectColor2 = _lightHighlight;
				_unselectColor3 = getPainter().getControlDk();
			}
		}

		installBackgroundColor();
	}

	@Override
	protected void installBackgroundColor() {
		if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_OFFICE2003) {
			if (_showFocusIndicator) {
				_backgroundSelectedColorStart = getPainter().getSelectionSelectedLt();
				_backgroundSelectedColorEnd = getPainter().getSelectionSelectedDk();
			} else {
				_backgroundSelectedColorStart = getPainter().getBackgroundLt();
				_backgroundSelectedColorEnd = getPainter().getBackgroundDk();
			}
			if (getTabShape() == JideTabbedPane.SHAPE_BOX) {
				_backgroundUnselectedColorStart = null;
				_backgroundUnselectedColorEnd = null;
			} else {
				_backgroundUnselectedColorStart = getPainter().getBackgroundLt();
				_backgroundUnselectedColorEnd = getPainter().getBackgroundDk();
			}
		} else {
			super.installBackgroundColor();
		}
	}

	// paint the background of the _tabScroller
	@Override
	public void paintBackground(Graphics g, Component c) {
		if (_tabPane.isOpaque()) {
			int width = c.getWidth();
			int height = c.getHeight();
			int h;
			int w;
			Graphics2D g2d = (Graphics2D) g;

			if (_tabPane.getTabCount() > 0) {
				h = _tabPane.getBoundsAt(0).height;
				w = _tabPane.getBoundsAt(0).width;
			} else {
				return;
			}

			int temp1 = -1;
			int temp2 = -1;
			if (isTabLeadingComponentVisible()) {
				if (h < _tabLeadingComponent.getSize().height) {
					h = _tabLeadingComponent.getSize().height;
					temp1 = _tabLeadingComponent.getSize().height;
				}
				if (w < _tabLeadingComponent.getSize().width) {
					w = _tabLeadingComponent.getSize().width;
					temp2 = _tabLeadingComponent.getSize().width;
				}
			}

			if (isTabTrailingComponentVisible()) {
				if (h < _tabTrailingComponent.getSize().height && temp1 < _tabTrailingComponent.getSize().height) {
					h = _tabTrailingComponent.getSize().height;
				}
				if (w < _tabTrailingComponent.getSize().width && temp2 < _tabTrailingComponent.getSize().width) {
					w = _tabTrailingComponent.getSize().width;
				}
			}

			super.paintBackground(g, c);

			Rectangle rect = null;
			if (_tabPane.getTabPlacement() == TOP) {
				rect = new Rectangle(0, 0, width, h + 2);

			} else if (_tabPane.getTabPlacement() == BOTTOM) {
				rect = new Rectangle(0, height - h - 2, width, h + 2);

			} else if (_tabPane.getTabPlacement() == LEFT) {
				rect = new Rectangle(0, 0, w + 2, height);

			} else if (_tabPane.getTabPlacement() == RIGHT) {
				rect = new Rectangle(width - w - 2, 0, w + 2, height);
			}
			if (rect != null) {
				paintTabAreaBackground(g, rect, _tabPane.getTabPlacement());
			}
		}
	}

	public static ComponentUI createUI(JComponent c) {
		return new Office2003JideTabbedPaneUI();
	}

	// paint the content top line when the tab is on the top
	@Override
	protected void paintContentBorderTopEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) {
		if (!PAINT_CONTENT_BORDER_EDGE) {
			return;
		}

		if (getColorTheme() != JideTabbedPane.COLOR_THEME_OFFICE2003) {
			super.paintContentBorderTopEdge(g, tabPlacement, selectedIndex, x, y, w, h);
			return;
		}

		if (selectedIndex < 0) {
			return;
		}

		Rectangle selRect = getTabBounds(selectedIndex, _calcRect);

		Rectangle viewRect = _tabScroller.viewport.getViewRect();
		Rectangle r = _rects[selectedIndex];

		int tabShape = getTabShape();

		Insets contentInsets = getContentBorderInsets(tabPlacement);

		if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_OFFICE2003) {
			if (tabShape == JideTabbedPane.SHAPE_OFFICE2003) {
				g.setColor(getPainter().getControlShadow());

				if (_alwaysShowLineBorder || _tabPane.hasFocusComponent()) {
					if (contentInsets.left > 0) {
						g.drawLine(x, y, x, y + h - 1);// left
					}
					if (contentInsets.right > 0) {
						g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right
					}
					if (contentInsets.bottom > 0) {
						g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom
					}

					if (contentInsets.top > 0 && _tabPane.isTabShown()) {
						if (r.x >= viewRect.x + viewRect.width) {
							g.drawLine(x, y, x + w - 1, y);// top
						} else {
							if (_tabPane.getComponentOrientation().isLeftToRight()) {
								g.drawLine(x, y, selRect.x - selRect.height + 2, y);// top left
								g.drawLine(selRect.x + selRect.width, y, x + w - 1, y);// top right
							} else {
								g.drawLine(x, y, selRect.x, y);// top left
								g.drawLine(selRect.x + selRect.width + selRect.height - 3, y, x + w - 1, y);// top right
							}
						}

						Rectangle bounds = _tabScroller.viewport.getBounds();
						g.drawLine(0, y, bounds.x, y);
						g.drawLine(bounds.x + bounds.width, y, x + w - 1, y);
					} else if (contentInsets.top > 0 && !_tabPane.isTabShown()) {
						g.drawLine(x, y, x + w - 1, y);// bottom
					}
				} else if (_tabPane.isTabShown()) {
					if (r.x >= viewRect.x + viewRect.width) {
						g.drawLine(x, y, x + w - 1, y);// top
					} else {
						if (_tabPane.getComponentOrientation().isLeftToRight()) {
							g.drawLine(x, y, selRect.x - selRect.height + 2, y);// top left
							g.drawLine(selRect.x + selRect.width, y, x + w - 1, y);// top right
						} else {
							g.drawLine(x, y, selRect.x, y);// top left
							g.drawLine(selRect.x + selRect.width + selRect.height - 3, y, x + w - 1, y);// top right
						}
					}

					Rectangle bounds = _tabScroller.viewport.getBounds();
					g.drawLine(x, y, bounds.x, y);
					g.drawLine(bounds.x + bounds.width, y, x + w - 1, y);
				}

			} else if (tabShape == JideTabbedPane.SHAPE_EXCEL) {
				g.setColor(getPainter().getControlShadow());

				g.drawLine(x, y, selRect.x - selRect.height / 2 + 4, y);// top left

				if (contentInsets.left > 0) {
					g.drawLine(x, y, x, y + h - 1);// left
				}
				if (contentInsets.right > 0) {
					g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right
				}
				if (contentInsets.bottom > 0) {
					g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom
				}


				if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) {
					g.drawLine(x, y, x + w - 1, y);// top
				} else {
					if (!_tabPane.isShowIconsOnTab()
							&& !_tabPane.isUseDefaultShowIconsOnTab()) {
						g.drawLine(selRect.x + selRect.width + selRect.height / 2 - 4,
								y, x + w - 1, y);// top right
					} else {
						g.drawLine(selRect.x + selRect.width + selRect.height / 2 - 6,
								y, x + w - 1, y);// top right
					}
				}
			} else if (tabShape == JideTabbedPane.SHAPE_WINDOWS
					|| tabShape == JideTabbedPane.SHAPE_WINDOWS_SELECTED) {
				g.setColor(getBorderEdgeColor());

				if (_tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_VSNET
						|| _tabPane.getColorTheme() == JideTabbedPane.COLOR_THEME_WINXP) {// the color set is winxp
					g.drawLine(x, y, selRect.x - 2, y);// top left
				} else {// the color set is default or office2003
					g.drawLine(x, y, selRect.x - 1, y);// top left
				}

				if (contentInsets.left > 0) {
					g.drawLine(x, y, x, y + h - 1);// left
				}

				if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) {
					g.setColor(_lightHighlight);
					g.drawLine(x, y, x + w - 1, y);// top
				} else {
					g.setColor(_lightHighlight);
					g.drawLine(selRect.x + selRect.width + 3, y, x + w - 1, y);// top right
				}


				g.setColor(getPainter().getControlDk());
				if (contentInsets.right > 0) {
					g.drawLine(x + w - 2, y + 1, x + w - 2, y + h - 2);// right
				}
				if (contentInsets.bottom > 0) {
					g.drawLine(x + 1, y + h - 2, x + w - 2, y + h - 2);// bottom
				}

				g.setColor(getPainter().getControlShadow());
				if (contentInsets.right > 0) {
					g.drawLine(x + w - 1, y + 1, x + w - 1, y + h - 1);// right
				}
				if (contentInsets.bottom > 0) {
					g.drawLine(x + 1, y + h - 1, x + w - 1, y + h - 1);// bottom
				}
			} else {
				super.paintContentBorderTopEdge(g, tabPlacement, selectedIndex, x, y, w, h);
			}
		} else {
			super.paintContentBorderTopEdge(g, tabPlacement, selectedIndex, x, y, w, h);
		}
	}

	// paint the content bottom line when the tab is on the bottom
	@Override
	protected void paintContentBorderBottomEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) {
		if (!PAINT_CONTENT_BORDER_EDGE) {
			return;
		}

		if (getColorTheme() != JideTabbedPane.COLOR_THEME_OFFICE2003) {
			super.paintContentBorderBottomEdge(g, tabPlacement, selectedIndex, x, y, w, h);
			return;
		}

		if (selectedIndex < 0) {
			return;
		}

		Rectangle selRect = getTabBounds(selectedIndex, _calcRect);

		Rectangle viewRect = _tabScroller.viewport.getViewRect();
		Rectangle r = _rects[selectedIndex];

		int tabShape = getTabShape();

		Insets contentInsets = getContentBorderInsets(tabPlacement);

		if (tabShape == JideTabbedPane.SHAPE_OFFICE2003) {
			g.setColor(getPainter().getControlShadow());

			if (_alwaysShowLineBorder || _tabPane.hasFocusComponent()) {
				if (contentInsets.left > 0) {
					g.drawLine(x, y, x, y + h - 1);// left
				}
				if (contentInsets.right > 0) {
					g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right
				}
				if (contentInsets.top > 0) {
					g.drawLine(x, y, x + w - 1, y);// top
				}

				if (contentInsets.bottom > 0 && _tabPane.isTabShown()) {
					if (r.x >= viewRect.x + viewRect.width) {
						g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom
					} else {
						if (_tabPane.getComponentOrientation().isLeftToRight()) {
							g.drawLine(x, y + h - 1, selRect.x - selRect.height + 2, y + h - 1);// bottom left
							g.drawLine(selRect.x + selRect.width, y + h - 1, x + w - 1, y + h - 1);// bottom right
						} else {
							g.drawLine(x, y + h - 1, selRect.x, y + h - 1);// bottom left
							g.drawLine(selRect.x + selRect.width + selRect.height - 3, y + h - 1, x + w - 1, y + h - 1);// bottom right
						}
					}

					Rectangle bounds = _tabScroller.viewport.getBounds();
					g.drawLine(x, y + h - 1, bounds.x, y + h - 1);
					g.drawLine(bounds.x + bounds.width, y + h - 1, x + w - 1, y + h - 1);
				} else if (contentInsets.bottom > 0 && !_tabPane.isTabShown()) {
					g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom
				}
			} else if (_tabPane.isTabShown()) {
				if (r.x >= viewRect.x + viewRect.width) {
					g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom
				} else {
					if (_tabPane.getComponentOrientation().isLeftToRight()) {
						g.drawLine(x, y + h - 1, selRect.x - selRect.height + 2, y + h - 1);// bottom left
						g.drawLine(selRect.x + selRect.width, y + h - 1, x + w - 1, y + h - 1);// bottom right
					} else {
						g.drawLine(x, y + h - 1, selRect.x, y + h - 1);// bottom left
						g.drawLine(selRect.x + selRect.width + selRect.height - 3, y + h - 1, x + w - 1, y + h - 1);// bottom right
					}
				}

				Rectangle bounds = _tabScroller.viewport.getBounds();
				g.drawLine(x, y + h - 1, bounds.x, y + h - 1);
				g.drawLine(bounds.x + bounds.width, y + h - 1, x + w - 1, y + h - 1);
			}
		} else if (tabShape == JideTabbedPane.SHAPE_EXCEL) {
			g.setColor(getPainter().getControlShadow());

			g.drawLine(x, y + h - 1, selRect.x - selRect.height / 2 + 4, y + h - 1);// bottom left

			if (contentInsets.left > 0) {
				g.drawLine(x, y, x, y + h - 1);// left
			}
			if (contentInsets.right > 0) {
				g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right
			}
			if (contentInsets.top > 0) {
				g.drawLine(x, y, x + w - 1, y);// top
			}

			if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) {
				g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom
			} else {
				if (!_tabPane.isShowIconsOnTab()
						&& !_tabPane.isUseDefaultShowIconsOnTab()) {
					g.drawLine(selRect.x + selRect.width + selRect.height / 2 - 4,
							y + h - 1, x + w - 1, y + h - 1);// bottom right
				} else {
					g.drawLine(selRect.x + selRect.width + selRect.height / 2 - 6,
							y + h - 1, x + w - 1, y + h - 1);// bottom right
				}
			}
		} else if (tabShape == JideTabbedPane.SHAPE_WINDOWS
				|| tabShape == JideTabbedPane.SHAPE_WINDOWS_SELECTED) {
			g.setColor(getPainter().getControlShadow());
			g.drawLine(x + 1, y + h - 1, selRect.x - 2, y + h - 1);
			if (contentInsets.right > 0) {
				g.drawLine(x + w - 1, y + h - 1, x + w - 1, y + 1);
			}

			if (!_tabPane.isTabShown() || r.x >= viewRect.x + viewRect.width) {
				g.setColor(getPainter().getControlShadow());
				g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);
			} else {
				g.setColor(getPainter().getControlShadow());
				g.drawLine(selRect.x + selRect.width, y + h - 1, x + w - 1, y + h - 1);
				g.setColor(getPainter().getControlDk());
				g.drawLine(selRect.x + selRect.width, y + h - 2, x + w - 2, y + h - 2);

				g.setColor(getPainter().getControlDk());
				g.drawLine(x + 1, y + h - 2, selRect.x - 2, y + h - 2);
				if (contentInsets.right > 0) {
					g.drawLine(x + w - 2, y + 1, x + w - 2, y + h - 2);
				}
				g.drawLine(selRect.x + selRect.width - 1, y + h - 1, selRect.x + selRect.width - 1, y + h - 1);

//                g.setColor(new Color(255, 199, 115));
//                g.drawLine(selRect.x, y + h - 1, selRect.x + selRect.width - 3, y + h - 1);
//                g.drawLine(selRect.x, y + h - 2, selRect.x + selRect.width, y + h - 2);

				g.setColor(new Color(255, 255, 255));
				g.drawLine(selRect.x - 1, y + h - 1, selRect.x - 1, y + h - 1);
				g.drawLine(selRect.x - 1, y + h - 2, selRect.x - 1, y + h - 2);

				if (contentInsets.left > 0) {
					g.drawLine(x, y, x, y + h - 2);
				}
				if (contentInsets.top > 0) {
					g.drawLine(x, y, x + w - 2, y);
				}
			}

		} else {
			super.paintContentBorderBottomEdge(g, tabPlacement, selectedIndex, x, y, w, h);
		}
	}

	// paint the content left line when the tab is on the left
	@Override
	protected void paintContentBorderLeftEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) {

		if (!PAINT_CONTENT_BORDER_EDGE) {
			return;
		}

		if (getColorTheme() != JideTabbedPane.COLOR_THEME_OFFICE2003) {
			super.paintContentBorderLeftEdge(g, tabPlacement, selectedIndex, x, y, w, h);
			return;
		}

		if (selectedIndex < 0) {
			return;
		}

		Rectangle selRect = getTabBounds(selectedIndex, _calcRect);

		Rectangle viewRect = _tabScroller.viewport.getViewRect();
		Rectangle r = _rects[selectedIndex];

		int tabShape = getTabShape();

		Insets contentInsets = getContentBorderInsets(tabPlacement);

		if (tabShape == JideTabbedPane.SHAPE_OFFICE2003) {
			g.setColor(getPainter().getControlShadow());

			if (_alwaysShowLineBorder || _tabPane.hasFocusComponent()) {
				if (contentInsets.top > 0) {
					g.drawLine(x, y, x + w - 1, y);// top
				}
				if (contentInsets.right > 0) {
					g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right
				}
				if (contentInsets.bottom > 0) {
					g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom
				}

				if (contentInsets.left > 0 && _tabPane.isTabShown()) {
					if (r.y >= viewRect.y + viewRect.height) {
						g.drawLine(x, y, x, y + h - 1);// left
					} else {
						g.drawLine(x, y, x, selRect.y - selRect.width + 2);// left top
						g.drawLine(x, selRect.y + selRect.height, x, y + h - 1);// left bottom
					}

					Rectangle bounds = _tabScroller.viewport.getBounds();
					g.drawLine(x, 0, x, bounds.y);
					g.drawLine(x, bounds.y + bounds.height, x, y + h - 1);
				} else if (contentInsets.left > 0 && !_tabPane.isTabShown()) {
					g.drawLine(x, y, x, y + h - 1);// left
				}
			} else if (_tabPane.isTabShown()) {
				if (r.y >= viewRect.y + viewRect.height) {
					g.drawLine(x, y, x, y + h - 1);// left
				} else {
					g.drawLine(x, y, x, selRect.y - selRect.width + 2);// left top
					g.drawLine(x, selRect.y + selRect.height, x, y + h - 1);// left bottom
				}

				Rectangle bounds = _tabScroller.viewport.getBounds();
				g.drawLine(x, y, x, bounds.y);
				g.drawLine(x, bounds.y + bounds.height, x, y + h - 1);
			}
		} else if (tabShape == JideTabbedPane.SHAPE_EXCEL) {
			g.setColor(getPainter().getControlShadow());

			g.drawLine(x, y, x, selRect.y - selRect.width / 2 + 4);// left top

			if (contentInsets.top > 0) {
				g.drawLine(x, y, x + w - 1, y);// top
			}
			if (contentInsets.right > 0) {
				g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right
			}
			if (contentInsets.bottom > 0) {
				g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom
			}

			if (!_tabPane.isTabShown() || r.y >= viewRect.y + viewRect.height) {
				g.drawLine(x, y, x, y + h - 1);// left
			} else {
				g.drawLine(x, selRect.y + selRect.height + selRect.width / 2 - 4,
						x, y + h - 1);// left bottom
			}
		} else if (tabShape == JideTabbedPane.SHAPE_WINDOWS
				|| tabShape == JideTabbedPane.SHAPE_WINDOWS_SELECTED) {
			g.setColor(getPainter().getControlShadow());
			if (contentInsets.right > 0) {
				g.drawLine(x + w - 1, y + 1, x + w - 1, y + h - 1);// right
			}
			if (contentInsets.bottom > 0) {
				g.drawLine(x + 1, y + h - 1, x + w - 1, y + h - 1);// bottom
			}

			g.setColor(getPainter().getControlDk());
			g.drawLine(x + w - 2, y + 1, x + w - 2, y + h - 2);
			g.drawLine(x + 1, y + h - 2, x + w - 2, y + h - 2);

			g.setColor(new Color(255, 255, 255));
			if (contentInsets.top > 0) {
				g.drawLine(x, y, x + w - 2, y);// top
			}
			g.drawLine(x, y, x, selRect.y - 1);

			if (!_tabPane.isTabShown() || r.y >= viewRect.y + viewRect.height) {
				g.drawLine(x, y, x, y + h - 2);
			} else {
				g.drawLine(x, selRect.y + selRect.height + 1, x, y + h - 2);
			}
		} else {
			super.paintContentBorderLeftEdge(g, tabPlacement, selectedIndex, x, y, w, h);
		}
	}

	// paint the content right line when the tab is on the right
	@Override
	protected void paintContentBorderRightEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) {
		if (!PAINT_CONTENT_BORDER_EDGE) {
			return;
		}

		if (getColorTheme() != JideTabbedPane.COLOR_THEME_OFFICE2003) {
			super.paintContentBorderRightEdge(g, tabPlacement, selectedIndex, x, y, w, h);
			return;
		}

		if (selectedIndex < 0) {
			return;
		}

		Rectangle selRect = getTabBounds(selectedIndex, _calcRect);

		Rectangle viewRect = _tabScroller.viewport.getViewRect();
		Rectangle r = _rects[selectedIndex];

		int tabShape = getTabShape();

		Insets contentInsets = getContentBorderInsets(tabPlacement);

		if (tabShape == JideTabbedPane.SHAPE_OFFICE2003) {
			g.setColor(getPainter().getControlShadow());

			if (_alwaysShowLineBorder || _tabPane.hasFocusComponent()) {
				if (contentInsets.top > 0) {
					g.drawLine(x, y, x + w - 1, y);// top
				}
				if (contentInsets.left > 0) {
					g.drawLine(x, y, x, y + h - 1);// left
				}
				if (contentInsets.bottom > 0) {
					g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom
				}

				if (contentInsets.right > 0 && _tabPane.isTabShown()) {
					if (r.y >= viewRect.y + viewRect.height) {
						g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right
					} else {
						g.drawLine(x + w - 1, y, x + w - 1, selRect.y - selRect.width + 2);// right top
						g.drawLine(x + w - 1, selRect.y + selRect.height, x + w - 1, y + h - 1);// right bottom
					}

					Rectangle bounds = _tabScroller.viewport.getBounds();
					g.drawLine(x + w - 1, 0, x + w - 1, bounds.y);
					g.drawLine(x + w - 1, bounds.y + bounds.height, x + w - 1, y + h - 1);
				} else if (contentInsets.right > 0 && !_tabPane.isTabShown()) {
					g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right
				}
			} else if (_tabPane.isTabShown()) {
				if (r.y >= viewRect.y + viewRect.height) {
					g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right
				} else {
					g.drawLine(x + w - 1, y, x + w - 1, selRect.y - selRect.width + 2);// right top
					g.drawLine(x + w - 1, selRect.y + selRect.height, x + w - 1, y + h - 1);// right bottom
				}

				Rectangle bounds = _tabScroller.viewport.getBounds();
				g.drawLine(x + w - 1, y, x + w - 1, bounds.y);
				g.drawLine(x + w - 1, bounds.y + bounds.height, x + w - 1, y + h - 1);
			}
		} else if (tabShape == JideTabbedPane.SHAPE_EXCEL) {
			g.setColor(getPainter().getControlShadow());

			g.drawLine(x + w - 1, y, x + w - 1, selRect.y - selRect.width / 2 + 4);// right top

			if (contentInsets.top > 0) {
				g.drawLine(x, y, x + w - 1, y);// top
			}
			if (contentInsets.left > 0) {
				g.drawLine(x, y, x, y + h - 1);// left
			}
			if (contentInsets.bottom > 0) {
				g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);// bottom
			}

			if (!_tabPane.isTabShown() || r.y >= viewRect.y + viewRect.height) {
				g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);// right
			} else {
				g.drawLine(x + w - 1, selRect.y + selRect.height + selRect.width / 2 - 4, x + w - 1, y + h - 1);// right bottom
			}
		} else if (tabShape == JideTabbedPane.SHAPE_WINDOWS
				|| tabShape == JideTabbedPane.SHAPE_WINDOWS_SELECTED) {
			g.setColor(getPainter().getControlDk());
			g.drawLine(x + w - 2, y + 1, x + w - 2, selRect.y - 2);
			g.drawLine(x + 1, y + h - 2, x + w - 2, y + h - 2);

			g.setColor(getPainter().getControlShadow());
			g.drawLine(x + w - 1, y + 1, x + w - 1, selRect.y - 2);
			if (contentInsets.bottom > 0) {
				g.drawLine(x + 1, y + h - 1, x + w - 1, y + h - 1);// bottom
			}

			if (!_tabPane.isTabShown() || r.y >= viewRect.y + viewRect.height) {
				g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);
				g.setColor(getPainter().getControlDk());
				g.drawLine(x + w - 2, y + 1, x + w - 2, y + h - 2);
			} else {
				g.drawLine(x + w - 1, selRect.y + selRect.height + 1, x + w - 1, y + h - 1);
				g.setColor(getPainter().getControlDk());
				g.drawLine(x + w - 2, selRect.y + selRect.height + 2, x + w - 2, y + h - 2);
				g.drawLine(x + w - 1, selRect.y + selRect.height, x + w - 1, selRect.y + selRect.height);
			}

			g.setColor(new Color(255, 255, 255));
			if (contentInsets.top > 0) {
				g.drawLine(x, y, x + w - 1, y);// top
			}
			if (contentInsets.left > 0) {
				g.drawLine(x, y, x, y + h - 1);// left
			}
		} else {
			super.paintContentBorderRightEdge(g, tabPlacement, selectedIndex, x, y, w, h);
		}
	}
}
